Skip to content
This repository has been archived by the owner on Sep 1, 2020. It is now read-only.

Latest commit

 

History

History
65 lines (50 loc) · 2.15 KB

4 - Runtime.md

File metadata and controls

65 lines (50 loc) · 2.15 KB

Runtime

4.1.0版本中,底层增加一个新的特性,可以在运行时动态将基于php_stream实现的扩展、PHP网络客户端代码一键协程化。底层替换了ZendVM Stream的函数指针,所有使用php_stream进行socket操作均变成协程调度的异步IO

目前有PHP原生RedisPDOMySQLi协程化的支持。

4.1版本仅支持tcpunix两种stream类型
4.2版本增加了对udpudgunixssltls类型的支持
4.2.3版本以前存在FILE_HOOK覆盖include/require的BUG, 请通过Swoole\Runtime::enableCoroutine(true, SWOOLE_HOOK_ALL ^ SWOOLE_HOOK_FILE);的方式屏蔽file hook

函数原型

function Runtime::enableCoroutine(bool $enable = true, int $flags = SWOOLE_HOOK_ALL);
  • $enable:打开或关闭协程
  • $flags:选择要Hook的类型,可以多选,默认为全选。仅在$enable = true时有效

$flags参数在4.2或更高版本可用,请参考:开关选项

可用列表

  • redis扩展
  • 使用mysqlnd模式的pdomysqli扩展,如果未启用mysqlnd将不支持协程化
  • soap扩展
  • file_get_contentsfopen
  • stream_socket_client (predis)
  • stream_socket_server
  • fsockopen

不可用列表

  • mysql:底层使用libmysqlclient
  • curl:底层使用libcurl (即不能使用CURL驱动的Guzzle
  • mongo:底层使用mongo-c-client
  • pdo_pgsql
  • pdo_ori
  • pdo_odbc
  • pdo_firebird

使用实例

Swoole\Runtime::enableCoroutine();

go(function () {
    $redis = new redis;
    $retval = $redis->connect("127.0.0.1", 6379);
    var_dump($retval, $redis->getLastError());
    var_dump($redis->get("key"));
    var_dump($redis->set("key", "value2"));
    var_dump($redis->get("key"));
    $redis->close();
});

方法摆放位置

调用方法后当前进程内全局生效, 一般放在整个项目最开头以获得100%覆盖的效果, 协程内外会自动切换模式, 不影响PHP原生环境使用.

注意: 不建议放在onRequest等回调中开启, 会多次调用造成不必要的调用开销.